package com.sh.util;

/**
 * @Auther: sh
 * @Version 1.0
 * @Description: 顺序栈的实现
 */
public class SequenceStack<T> {

    private int maxSize;//栈的最大容量
    private T[] arr;//存储入栈的元素
    private int top;//指向栈顶的指针


    public SequenceStack(int maxSize) {
        this.maxSize = maxSize;
        arr = (T[]) new Object[maxSize];
        this.top = -1;
    }

    public boolean isFull() {
        return top == maxSize - 1;
    }

    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 入栈
     *
     * @return true表示入栈成功
     */
    public boolean push(T n) {
        if (isFull()) {
            return false;
        }
        top++;
        arr[top] = n;
        return true;
    }

    /**
     * 出栈
     *
     * @return true表示出栈成功
     */
    public T pop() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空，无法出栈");
        }
        T res = arr[top];
        top--;
        return res;
    }

    /**
     * 取栈顶元素
     * 注意：只是获取，并不需要减少栈中的元素
     */
    public T peek() {
        if (isEmpty()) {
            throw new RuntimeException("栈为空，没有元素");
        }
        return arr[top];
    }

    /**
     * 获取栈中元素的个数
     *
     * @return
     */
    public int size() {
        return top + 1;
    }

    /**
     * 展示栈中所有的元素
     * 注意：需要从栈顶开始展示
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("栈为空");
            return;
        }
        int temp = top;
        while (temp >= 0) {
            System.out.print(arr[temp] + "\t");
            temp--;
        }
        System.out.println();
    }

    /**
     * 清空栈中元素
     */
    public boolean clear() {
        top = -1;
        return true;
    }
}

